package com.ywj.interview.thread.concurrence;

/**
 * Synchronized【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】，其它线程再想获取这个【对象锁】时就会阻塞住
 */
public class TicketDemo {
    static Object lock = new Object();
    int ticketNum = 10;
    public void getTicket() {
        synchronized (lock) {
            if (ticketNum <= 0) {
                return;
            }
            System.out.println(Thread.currentThread().getName() + "抢到一张票，剩余：" + ticketNum);
            //非原子性操作
            ticketNum--;
        }
    }

    public static void main(String[] args) {
        TicketDemo ticketDemo = new TicketDemo();
        for (int i = 0; i < 20; i++) {
           new Thread(() -> {
               ticketDemo.getTicket();
           }).start();
        }
    }
}
//加synchronized
/*
Thread-0抢到一张票，剩余：10
Thread-7抢到一张票，剩余：9
Thread-5抢到一张票，剩余：8
Thread-4抢到一张票，剩余：7
Thread-3抢到一张票，剩余：6
Thread-2抢到一张票，剩余：5
Thread-10抢到一张票，剩余：4
Thread-1抢到一张票，剩余：3
Thread-11抢到一张票，剩余：2
Thread-8抢到一张票，剩余：1
*/

//未加synchronized
/*
Thread-0抢到一张票，剩余：10
Thread-7抢到一张票，剩余：10
Thread-9抢到一张票，剩余：10
Thread-4抢到一张票，剩余：10
Thread-6抢到一张票，剩余：10
Thread-5抢到一张票，剩余：10
Thread-10抢到一张票，剩余：4
Thread-3抢到一张票，剩余：10
Thread-1抢到一张票，剩余：10
Thread-12抢到一张票，剩余：1
Thread-2抢到一张票，剩余：10
Thread-8抢到一张票，剩余：7
Thread-11抢到一张票，剩余：7*/
